/* Copyright (c) 2013 OpenPlans - www.openplans.org. All rights reserved.
 * This code is licensed under the GPL 2.0 license, available at the root
 * application directory.
 */
package org.geoserver.threadlocals;

import java.util.Map;

/**
 * Implementors of this interface allow to transfer thread locals from the current thread to another
 * one. They are used to make sure important thread local values are transferred into thread
 * pools/scheduled tasks/delayed actions executing portions of the GeoServer work
 * 
 * @author Andrea Aime - GeoSolutions
 * 
 */
public interface ThreadLocalTransfer {

    /**
     * Collects the current thread locals values into the storage. The implementation must try hard
     * to use a unique name for each key (a good choice is
     * fullyQualifiedClassName#thredLocalFieldName), the caller utility will make sure there are no
     * conflicts (in case of conflict an exception will be thrown)
     */
    void collect(Map<String, Object> storage);

    /**
     * Set the thread local values in the current thread
     */
    void apply(Map<String, Object> storage);

    /**
     * Clean up the thread locals in the current thread
     */
    void cleanup();
}
